POJ-3984___迷宫问题 —— BFS + 路径记录

题目链接:点我啊╭(╯^╰)╮

题目大意:

    从 ( 1 , 1 ) (1,1) 1,1走到 ( 5 , 5 ) (5,5) 5,5求最短路径并输出

核心:用一道简单题记录一下模板

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
int dx[] = {1,-1,0,0};
int dy[] = {0,0,1,-1};
int cnt = 1, mp[10][10];
bool vis[10][10];
stack <pii> r;
struct pot {
	int u, v;
	int pre;
};

void BFS(int u, int v) {
	queue <pot> Q;
	pot q, n, n_cnt[1000];
	q.u = u, q.v = v;
	q.pre = 0; Q.push(q);
	vis[u][v] = true;
	while(!Q.empty()) {
		q = Q.front(); Q.pop();
		for(int i=0; i<4; i++) {
			n.u = q.u + dx[i];
			n.v = q.v + dy[i];

			if(n.u<1 || n.u>5 || n.v<1 || n.v>5) continue;
			if(vis[n.u][n.v] || mp[n.u][n.v]) continue;
			vis[n.u][n.v] = true;
			n_cnt[cnt] = q;
			n.pre = cnt++;	//这里一开始弄错了、没连起来....
			if(n.u==5 && n.v==5) {
				while(n.pre) {
					r.push(make_pair(n.u, n.v));
					n = n_cnt[n.pre];
				}
				r.push(make_pair(1, 1));
				return;
			}
			Q.push(n);
		}
	}
}

void print() {
	while(!r.empty()) {
		printf("(%d, %d)\n", r.top().first-1, r.top().second-1);
		r.pop();
	}
}

int main() {
	for(int i=1; i<6; i++)
		for(int j=1; j<6; j++)
			scanf("%d", &mp[i][j]);
	BFS(1, 1);
	print();
}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值